import {DependencyList, useEffect, useState} from 'react';
import {ApiResult} from "@/global";

export interface UseLoadProps<T> {
  /** 是否加载数据 */
  isLoad?: boolean,
  /** 是否在加载数据前清理数据 */
  isClear?: boolean,
  /** 加载失败或者未加载数据时的默认值 */
  defaultData?: T | undefined;
  /** 数据读取函数 */
  onLoad: () => Promise<ApiResult<T>>;
  /** 数据读取成功后回调函数 */
  onSuccess?: (data: T | undefined) => void;
}

export interface LoadUseResult<T> {
  /** 表示数据读取是否正在进行中 */
  loading: boolean,
  /** 加载的数据 */
  data: T | undefined;
}

/** 组件首页加载时执行的数据加载 hook */
function useLoad<T>(props: UseLoadProps<T>, deps?: DependencyList): LoadUseResult<T> {
  const {isLoad = true, isClear = true, defaultData, onLoad, onSuccess} = props;
  const dps = deps || [];

  const [loading, setLoading] = useState<boolean>(false);
  const [data, setData] = useState<T>();

  useEffect(() => {
    //如果不加载数据或者未指定加载函数,则直接返回
    if (!isLoad || !onLoad) return;
    setLoading(true);
    onLoad()
      .then((r) => {
        setLoading(false);
        if (r.success) {
          const d = r.data;
          setData(d);
          onSuccess && onSuccess(d);
        }
      })
      .catch(() => setLoading(false));
    //清理数据
    return isClear ? () => setData(undefined) : undefined;
  }, dps);

  return {
    loading,
    data: data || defaultData,
  };
}

export default useLoad;
